package ddd.leave.domain.leave.entity;

import ddd.leave.domain.leave.entity.valueobject.Applicant;
import ddd.leave.domain.leave.entity.valueobject.Approver;
import ddd.leave.domain.leave.entity.valueobject.LeaveType;
import ddd.leave.domain.leave.entity.valueobject.Status;
import lombok.Data;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 请假单信息
 */
@Data
public class Leave {
    // 请假id
    String id;
    // 申请人信息
    Applicant applicant;
    // 审批人信息
    Approver approver;
    // 请假类型
    LeaveType type;
    // 请假当前审批状态
    Status status;
    // 审批开始时间
    Date startTime;
    // 审批结束时间
    Date endTime;
    // 审批持续时间
    long duration;
    // 审批领导的最大级别
    int leaderMaxLevel;
    // 当前审批信息
    ApprovalInfo currentApprovalInfo;
    // 历史审批信息
    List<ApprovalInfo> historyApprovalInfos;

    /**
     * 获取审批持续时间
     * @return
     */
    public long getDuration() {
        return endTime.getTime() - startTime.getTime();
    }

    /**
     * 添加审批历史记录到请假信息中
     * @param approvalInfo
     * @return
     */
    public Leave addHistoryApprovalInfo(ApprovalInfo approvalInfo) {
        if (null == historyApprovalInfos)
            historyApprovalInfos = new ArrayList<>();
        this.historyApprovalInfos.add(approvalInfo);
        return this;
    }

    /**
     * 创建审批时 初始化审批状态为审批中  初始化审批开始时间
     * @return
     */
    public Leave create(){
        this.setStatus(Status.APPROVING);
        this.setStartTime(new Date());
        return this;
    }

    /**
     * 同意审批 传入审批人，将审批人设置到当前请假信息对象中
     * 将审批状态设置为同意
     * @param nextApprover
     * @return
     */
    public Leave agree(Approver nextApprover){
        this.setStatus(Status.APPROVING);
        this.setApprover(nextApprover);
        return this;
    }

    public Leave reject(Approver approver){
        this.setApprover(approver);
        this.setStatus(Status.REJECTED);
        this.setApprover(null);
        return this;
    }

    /**
     * 完成审批
     *  审批人设置为null ?
     *  设置审批状态同意，设置审批结束时间， 设置审批持续时间
     * @return
     */
    public Leave finish(){
        this.setApprover(null);
        this.setStatus(Status.APPROVED);
        this.setEndTime(new Date());
        this.setDuration(this.getEndTime().getTime() - this.getStartTime().getTime());
        return this;
    }
}
